import os
from sys import platform
# import wmi
from datetime import datetime
import requests
import re

from PIL import Image
from docx.shared import Pt,Inches
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT

from docx.oxml import OxmlElement
from docx.oxml.ns import qn
#
# # 打印系统信息
# def print_system_info():
#     print("系统信息:")
#     # print(f"操作系统: {platform.system()} {platform.release()}")
#     # print(f"Python 版本: {platform.python_version()}")
#     print(f"当前工作目录: {os.getcwd()}")
#
#     # 使用 wmi 获取更详细的系统信息
#     c = wmi.WMI()
#
#     # 获取 CPU 序列号
#     for cpu in c.Win32_Processor():
#         print(f"CPU 序列号: {cpu.ProcessorId}")
#
#     # 获取主板序列号
#     for board in c.Win32_BaseBoard():
#         print(f"主板序列号: {board.SerialNumber}")
#
#     # 获取硬盘序列号
#     for disk in c.Win32_DiskDrive():
#         print(f"硬盘序列号: {disk.SerialNumber}")


def is_connected_to_internet(website_url):
    try:
        # 尝试访问一个外部网站，例如 Google
        response = requests.get(website_url, timeout=3)
        return response.status_code == 200
    except requests.ConnectionError:
        # 如果连接失败，说明当前是离线状态
        return False

def save_file_with_timestamp(file):
    # 获取当前时间戳并转换为整数
    timestamp = int(datetime.now().timestamp())

    # 保存文件到upload目录
    upload_dir = 'upload'
    if not os.path.exists(upload_dir):
        os.makedirs(upload_dir)

    # 获取文件名和扩展名
    filename, file_extension = os.path.splitext(file.filename)

    # 生成新的文件名
    new_filename = f"{filename}_{timestamp}{file_extension}"
    file_path = os.path.join(upload_dir, new_filename)
    file.save(file_path)
    return file_path


def merge_string(str1, str2):
    words1=[]
    words2=[]
    # 按分隔符 ',' 分割字符串
    if str1:
        words1 = [word.strip() for word in str1.split(',') if word.strip()] if str1 else []
    if str2:
        words2 = [word.strip() for word in str2.split(',') if word.strip()] if str2 else []
    # 合并去重
    unique_words = list(set(words1 + words2))

    # 汇总成一个字符串，并用 ',' 隔开
    result = ','.join(unique_words)
    return result

def format_data_flow(d_flow):
    # dflow: 麦克风—>HU(网络)—>后台(网络xy)—>HU—>GW—>IBCM
    # 将入参字符串, 去掉多余的(xxx) -> 麦克风—>HU—>后台—>HU—>GW—>IBCM
    # 使用正则表达式去掉多余的括号及其内容
    if d_flow is None or not isinstance(d_flow, str):
        return ''

    # 使用正则表达式匹配所有括号内的内容
    pattern = r'\(.*?\)|\（.*?\）'  # 匹配 (CAN) 和 （CAN）
    result = re.sub(pattern, '', str(d_flow))
    return result


def check_data_flow(d_flow, ecu_table, pid):
    if d_flow and isinstance(d_flow, str):

        # 按分隔符 '—>', ';', 和 '<-->' 分割字符串，并去掉前后的空格/回车
        words = [word.strip() for word in re.split(r'[|]|—>|→|<—|;|,|&|←→|\n', d_flow)]


        # 查询 EcuTable 表中的所有 abbr 字段
        existing_abbrs = {row.abbr for row in ecu_table.query.filter_by(Project_id=pid).with_entities(ecu_table.abbr).all()}

        # 找出不存在的单词
        # non_existing_words = [word for word in words if word not in existing_abbrs]

        # 找出存在的单词
        existing_words = [word for word in words if word in existing_abbrs]
        # 去重
        unique_existing_words = list(set(existing_words))

        # 汇总为一个字符串
        result = ','.join(unique_existing_words)
    else:
        result = ""

    return result

def validate_user_data(data):
    if not data.get('name'):
        return '用户名不能为空'
    if not data.get('pwd'):
        return '密码不能为空'
    # if not data.get('email') or '@' not in data['email']:
    #     return '邮箱格式不正确'
    return None

# 定义细实线的边框样式
def set_thin_solid_border(cell):
    """设置单元格的边框为细实线"""
    tc = cell._element
    tcPr = tc.get_or_add_tcPr()
    tcBorders = OxmlElement('w:tcBorders')
    for border in ['top', 'left', 'bottom', 'right']:
        border_tag = OxmlElement('w:{}'.format(border))
        border_tag.set(qn('w:val'), 'single')
        border_tag.set(qn('w:sz'), '4')  # 4代表细线
        border_tag.set(qn('w:space'), '0')
        border_tag.set(qn('w:color'), 'auto')
        tcBorders.append(border_tag)
    tcPr.append(tcBorders)

#通过文本定位到一个段落，并在该段落之后插入新的段落
def insert_paragraph_after(doc, p_src, after_paragraph_text):
    # 查找目标段落的索引
    index = doc.paragraphs.index(p_src)

    # 在目标段落之后插入一个新的段落
    if index + 1 < len(doc.paragraphs):
        next_paragraph = doc.paragraphs[index + 1]
        new_paragraph = next_paragraph.insert_paragraph_before(after_paragraph_text)
    else:
        # 如果第一个段落是最后一个段落，直接添加新的段落到文档末尾
        new_paragraph = doc.add_paragraph(after_paragraph_text)
    return new_paragraph


#设置表格的宽度，输入的是宽度数组，从第一列开始，逐列设置
def set_table_col_widths(table, widths):
    for i, width in enumerate(widths):
        for row in table.rows:
            cell = row.cells[i]
            cell.width = Inches(width)

# 查找doc文档中的表格，如果表格第一行第二列的内容等于req_type，则返回该表格。
# 参数:
#     doc: python-docx的Document对象。
#     req_type: 需要匹配的需求类型字符串。
# 返回:
#     匹配到的表格对象，如果未找到则返回None。
def find_table_by_req_type(doc, req_type):
    # 遍历文档中的所有表格
    for table in doc.tables:
        # 检查表格是否有至少一行和一列
        if len(table.rows) > 0 and len(table.columns) > 1:
            # 获取第一行第二列的内容
            first_row_second_cell = table.rows[0].cells[1].text.strip()
            # 如果内容匹配req_type，返回该表格
            if first_row_second_cell == req_type:
                return table
    # 如果未找到匹配的表格，返回None
    return None

# 获取图片的实际宽度（以英寸为单位）
def get_image_width_in_inches(image_path):
    with Image.open(image_path) as img:
        width_px = img.width  # 获取图片的宽度（像素）
        dpi = img.info.get('dpi', (96, 96))  # 获取图片的DPI，默认值为96
        # print(f'dpi={dpi}')
        width_inches = width_px / dpi[0]  # 将像素转换为英寸
        return width_inches * 0.7

# 判断是否需要缩放图片
def get_scaled_width(image_path, max_width_inches):
    actual_width_inches = get_image_width_in_inches(image_path)
    if actual_width_inches <= max_width_inches:
        # return None  # 不缩放，按实际尺寸插入
        return Inches(actual_width_inches)  # 不缩放，按实际尺寸插入
    else:
        return Inches(max_width_inches)  # 缩放至最大宽度
